In my previous post Access the EntityManager from Spring Data JPA I showed how to extend a single Spring Data JPA repository to access the EntityManager.refresh method. This post demonstrates how to Add EntityManager.refresh to all Spring Data Repositories.
The first step is to define your interface –
package com.glenware.springboot.repository; import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.Repository; import org.springframework.data.repository.CrudRepository; import java.io.Serializable; import java.util.Optional; @NoRepositoryBean public interface CustomRepositoryextends CrudRepository { void refresh(T t); }
The key points are –
The next step is to implement this interface in a custom repository –
package com.glenware.springboot.repository; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.jpa.repository.support.JpaEntityInformation; import javax.persistence.EntityManager; import java.io.Serializable; public class CustomRepositoryImplextends SimpleJpaRepository>T, ID> implements CustomRepository { private final EntityManager entityManager; public CustomRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) { super(entityInformation, entityManager); this.entityManager = entityManager; } @Override @Transactional public void refresh(T t) { entityManager.refresh(t); } }
Key points are –
The final step is to let Spring Data know that its base class is CustomRepositoryImpl –
package com.glenware.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import com.glenware.springboot.repository.CustomRepositoryImpl; @SpringBootApplication @EnableJpaRepositories(repositoryBaseClass = CustomRepositoryImpl.class) public class ParkrunpbApplication { public static void main(String[] args) { SpringApplication.run(ParkrunpbApplication.class, args); } }
Key Points –
We can then use this repository in our classes so we change our repository from the previous post from CrudRepository to extend CustomRepository –
package com.glenware.springboot.repository; import com.glenware.springboot.form.ParkrunCourse; public interface ParkrunCourseRepository extends CustomRepository{ }
We can now access the EntityManager.refresh method using –
parkrunCourseRepository.refresh( parkrunCourse );
The above code was tested by running it against Spring Boot (1.5.6-Release) which used Spring Data JPA 1.11.6.Release. I can add the code to github if requested
One area you need to check is what version of Spring Data JPA you are running for extending repositories. I’ve had to adapt this approach for older repositories, although this is the current method using Spring Data JPA 1.11.6 Release